package zbl.c0.inter;

import zbl.c0.lexer.Tag;

/**
 * 		运算栈
 * @author 朱伯龙
 *
 */

public class CalculStack {
	
	private static int MAX_DEPTH = 1000;	//  运算栈最大深度
	
	private int top;						//  运算栈栈顶指针(始终指向栈顶的下一个位置)
	
	private int[] stack;					//  运算栈内容
	
	/**
	 * 		初始化运算栈
	 */
	public CalculStack(){
		stack = new int[MAX_DEPTH];
		top = 0;
	}
	
	/**
	 * 		显示当前运算栈
	 */
	public void showStack(){
		System.out.println("########CalculStack########");
		for(int i=0; i<top; i++)
			System.out.println(i+"   :   "+stack[i]);
		System.out.println("###########################");
	}
	
	/**
	 * 		返回栈顶元素的值,同时栈顶指针减1  
	 * 适合于STO操作
	 * @return
	 */
	public int gettopEl(){
		top--;
		if(top<0){
			System.out.println("运算栈栈顶为空，即没有任何信息！！！");
		}
		return stack[top];
	}
	
	/**
	 * 		将value放到栈顶
	 * @param value
	 */
	public void push(int value){
		if(top < MAX_DEPTH)
			stack[top++] = value;
		else{
			System.out.println("运算栈溢出，无法入栈！！！");
		}
	}
	
	/**
	 * 		根据opkind对运算栈的栈顶和次栈顶进行操作
	 * @param opkind		主要对应OPR指令
	 */
	public void opera(int opkind){
		
		int var1,var2,var;
		var1 = stack[top-2];
		var2 = stack[top-1];
		
		switch(opkind){
		case '+':	var = var1+var2; break;
		case '-':	var = var1-var2; break;
		case '*':	var = var1*var2; break;
		case '/':	var = var1/var2; break;
		default: 	System.out.println("未定义的运算栈栈顶和次栈顶操作！！！");
					return;
		}
		
		stack[top-2] = var;
		top--;
	
	}
	
	/**
	 * 		判断条件   次栈顶<opKind>栈顶
	 * @param opKind
	 * @return	条件是否成立
	 */
	public Boolean conduct(int opKind){
		int var1,var2;
		var1 = stack[top-2];		//	次栈顶元素
		var2 = stack[top-1];		//	栈顶元素
		
		top = top-2;				//  置运算栈栈顶为当前栈顶减2
		
		switch(opKind){
		
		case '>':					if(var1 > var2) return true;	return false;
		case '<':					if(var1 < var2) return true;	return false;
		case Tag.SMALLER_EQUAL:		if(var1 <= var2) return true;	return false;
		case Tag.LARGER_EQUAL:		if(var1 >= var2) return true;	return false;
		case Tag.EQUAL:				if(var1 == var2) return true;	return false;
		case Tag.NOT_EQUAL:			if(var1 != var2) return true;	return false;
		default:		System.out.println("位置判断条件运算栈无法识别,默认返回假");
						return false;
		}
	}
	
	/**
	 * 		运算栈栈顶指针减小 a
	 * @param a
	 */
	public void minus(int a){
		if(top-a<0)
		{
			System.out.println("运算栈栈顶指针减a小于零  异常！！");
		}else{
			top = top-a;
		}
	}
	
}
